Khám phá sức mạnh của TypeScript trong việc đảm bảo an toàn kiểu dữ liệu phân tán thông qua liên kết dữ liệu, một phương pháp quan trọng cho các ứng dụng hiện đại.
TypeScript Data Federation: Đạt Được An Toàn Kiểu Dữ Liệu Phân Tán
Trong bối cảnh kỹ thuật số ngày càng kết nối như hiện nay, các ứng dụng hiếm khi còn nguyên khối. Chúng thường được phân tán, bao gồm nhiều microservices, API bên ngoài và các nguồn dữ liệu phải giao tiếp liền mạch. Sự phân tán này, trong khi mang lại sự nhanh nhẹn và khả năng mở rộng, lại đặt ra những thách thức đáng kể, đặc biệt là xung quanh tính nhất quán và tính toàn vẹn của dữ liệu. Làm thế nào để chúng ta đảm bảo rằng dữ liệu được trao đổi giữa các hệ thống khác biệt này vẫn giữ được cấu trúc và ý nghĩa dự kiến, ngăn chặn lỗi thời gian chạy và thúc đẩy sự phát triển mạnh mẽ? Câu trả lời nằm ở TypeScript Data Federation, một mô hình mạnh mẽ tận dụng khả năng gõ tĩnh của TypeScript để thực thi tính an toàn kiểu dữ liệu trên các ranh giới dữ liệu phân tán.
Thách thức của Dữ liệu Phân tán
Hãy tưởng tượng một nền tảng thương mại điện tử toàn cầu. Các dịch vụ khác nhau xử lý xác thực người dùng, danh mục sản phẩm, xử lý đơn hàng và cổng thanh toán. Mỗi dịch vụ có thể được phát triển bởi một nhóm khác nhau, có thể sử dụng các ngôn ngữ lập trình hoặc khung khác nhau và nằm trên các máy chủ khác nhau hoặc thậm chí trong các môi trường đám mây khác nhau. Khi các dịch vụ này cần trao đổi dữ liệu – ví dụ, khi một dịch vụ đặt hàng cần truy xuất chi tiết người dùng từ dịch vụ xác thực và thông tin sản phẩm từ dịch vụ danh mục – một số rủi ro sẽ xuất hiện:
- Không khớp kiểu: Một trường được một dịch vụ dự kiến là một chuỗi có thể được gửi dưới dạng một số bởi dịch vụ khác, dẫn đến hành vi không mong muốn hoặc sự cố.
 - Thay đổi lược đồ: Khi các dịch vụ phát triển, lược đồ dữ liệu của chúng có thể thay đổi độc lập. Nếu không có cơ chế để theo dõi và xác thực những thay đổi này, người dùng dữ liệu đó có thể gặp phải các cấu trúc không tương thích.
 - Không nhất quán dữ liệu: Nếu không có sự hiểu biết thống nhất về các kiểu và cấu trúc dữ liệu, việc đảm bảo dữ liệu vẫn nhất quán trong toàn bộ hệ thống phân tán sẽ trở nên khó khăn.
 - Xung đột nhà phát triển: Các nhà phát triển thường dành nhiều thời gian để gỡ lỗi các sự cố do định dạng dữ liệu không mong muốn gây ra, làm giảm năng suất và tăng chu kỳ phát triển.
 
Các phương pháp truyền thống để giảm thiểu những vấn đề này thường liên quan đến việc xác thực thời gian chạy mở rộng, dựa nhiều vào việc kiểm tra thủ công và lập trình phòng thủ. Mặc dù cần thiết, nhưng các phương pháp này thường không đủ để chủ động ngăn chặn lỗi trong các hệ thống phân tán phức tạp.
Data Federation là gì?
Data Federation là một phương pháp tích hợp dữ liệu cho phép các ứng dụng truy cập và truy vấn dữ liệu từ nhiều nguồn khác biệt như thể đó là một cơ sở dữ liệu duy nhất, thống nhất. Thay vì hợp nhất vật lý dữ liệu vào một kho lưu trữ trung tâm (giống như trong kho dữ liệu), data federation cung cấp một lớp ảo trừu tượng hóa các nguồn dữ liệu cơ bản. Lớp này xử lý sự phức tạp của việc kết nối, truy vấn và chuyển đổi dữ liệu từ các vị trí và định dạng khác nhau theo yêu cầu.
Các đặc điểm chính của data federation bao gồm:
- Ảo hóa: Dữ liệu vẫn ở vị trí ban đầu.
 - Trừu tượng hóa: Một giao diện hoặc ngôn ngữ truy vấn duy nhất được sử dụng để truy cập dữ liệu đa dạng.
 - Truy cập theo yêu cầu: Dữ liệu được truy xuất và xử lý khi được yêu cầu.
 - Bất khả tri nguồn: Nó có thể kết nối với cơ sở dữ liệu quan hệ, kho NoSQL, API, tệp phẳng, v.v.
 
Mặc dù data federation vượt trội trong việc thống nhất quyền truy cập, nhưng nó vốn không giải quyết được vấn đề an toàn kiểu dữ liệu giữa lớp liên kết và các ứng dụng tiêu thụ, hoặc giữa các dịch vụ khác nhau có thể tham gia vào chính quá trình liên kết.
TypeScript giải cứu: Gõ tĩnh cho Dữ liệu Phân tán
TypeScript, một tập hợp con của JavaScript, mang lại việc gõ tĩnh cho web và hơn thế nữa. Bằng cách cho phép các nhà phát triển xác định các kiểu cho các biến, tham số hàm và giá trị trả về, TypeScript cho phép phát hiện các lỗi liên quan đến kiểu trong giai đoạn phát triển, trước khi mã đến được giai đoạn sản xuất. Đây là một yếu tố thay đổi cuộc chơi đối với các hệ thống phân tán.
Khi chúng ta kết hợp gõ tĩnh của TypeScript với các nguyên tắc của data federation, chúng ta mở ra một cơ chế mạnh mẽ cho An Toàn Kiểu Dữ Liệu Phân Tán. Điều này có nghĩa là đảm bảo rằng hình dạng và kiểu của dữ liệu được hiểu và xác thực trên mạng, từ nguồn dữ liệu thông qua lớp liên kết đến ứng dụng khách tiêu thụ.
Cách TypeScript cho phép An Toàn Kiểu Dữ Liệu Liên Kết
TypeScript cung cấp một số tính năng chính có vai trò quan trọng trong việc đạt được an toàn kiểu trong data federation:
1. Định nghĩa Giao diện và Kiểu
Từ khóa interface và type của TypeScript cho phép các nhà phát triển xác định rõ ràng cấu trúc dữ liệu dự kiến. Khi làm việc với dữ liệu được liên kết, những định nghĩa này đóng vai trò là hợp đồng.
Ví dụ:
Hãy xem xét một hệ thống được liên kết truy xuất thông tin người dùng từ một microservice. Đối tượng người dùng dự kiến có thể được định nghĩa là:
            
interface User {
  id: string;
  username: string;
  email: string;
  registrationDate: Date;
  isActive: boolean;
}
            
          
        Giao diện User này chỉ định rõ ràng rằng id, username và email phải là chuỗi, registrationDate là một đối tượng Date và isActive là một boolean. Bất kỳ dịch vụ hoặc nguồn dữ liệu nào dự kiến trả về một đối tượng người dùng phải tuân thủ hợp đồng này.
2. Generics
Generics cho phép chúng ta viết mã có thể tái sử dụng, có thể hoạt động với nhiều kiểu khác nhau trong khi vẫn giữ lại thông tin kiểu. Điều này đặc biệt hữu ích trong các lớp data federation hoặc ứng dụng khách API xử lý bộ sưu tập dữ liệu hoặc hoạt động trên các cấu trúc dữ liệu khác nhau.
Ví dụ:
Một hàm tìm nạp dữ liệu chung có thể được định nghĩa như thế này:
            
async function fetchData<T>(url: string): Promise<T> {
  const response = await fetch(url);
  if (!response.ok) {
    throw new Error(`HTTP error! status: ${response.status}`);
  }
  const data: T = await response.json();
  return data;
}
// Usage with the User interface:
async function getUser(userId: string): Promise<User> {
  return fetchData<User>(`/api/users/${userId}`);
}
            
          
        Ở đây, fetchData<T> đảm bảo rằng dữ liệu trả về sẽ có kiểu T, trong ví dụ getUser được chỉ định rõ ràng là User. Nếu API trả về dữ liệu không tuân theo giao diện User, TypeScript sẽ gắn cờ nó trong quá trình biên dịch.
3. Type Guards và Assertions
Mặc dù phân tích tĩnh bắt được nhiều lỗi, nhưng đôi khi dữ liệu đến từ các nguồn bên ngoài ở định dạng không hoàn toàn phù hợp với các kiểu TypeScript nghiêm ngặt của chúng ta (ví dụ: từ các hệ thống cũ hoặc API JSON được gõ lỏng lẻo). Type guards và assertions cho phép chúng ta thu hẹp an toàn các kiểu khi chạy hoặc khẳng định rằng một kiểu nhất định là đúng, với điều kiện chúng ta có xác thực bên ngoài.
Ví dụ:
Một hàm trình xác thực thời gian chạy có thể được sử dụng làm type guard:
            
function isUser(data: any): data is User {
  return (
    typeof data === 'object' &&
    data !== null &&
    'id' in data && typeof data.id === 'string' &&
    'username' in data && typeof data.username === 'string' &&
    'email' in data && typeof data.email === 'string' &&
    'registrationDate' in data && typeof data.registrationDate === 'string' && // Assuming ISO string from API
    'isActive' in data && typeof data.isActive === 'boolean'
  );
}
async function fetchAndValidateUser(userId: string): Promise<User> {
  const rawData = await fetchData<any>(`/api/users/${userId}`);
  if (isUser(rawData)) {
    // We can confidently treat rawData as User here, potentially with type casting for dates
    return {
      ...rawData,
      registrationDate: new Date(rawData.registrationDate)
    };
  } else {
    throw new Error('Invalid user data received');
  }
}
            
          
        4. Tích hợp với Ngôn ngữ Định nghĩa API
Data federation hiện đại thường liên quan đến việc tương tác với các API được xác định bằng các ngôn ngữ như OpenAPI (trước đây là Swagger) hoặc Ngôn ngữ Định nghĩa Lược đồ GraphQL (SDL). TypeScript có hỗ trợ công cụ tuyệt vời để tạo định nghĩa kiểu từ các thông số kỹ thuật này.
- OpenAPI: Các công cụ như 
openapi-typescriptcó thể tự động tạo giao diện và kiểu TypeScript trực tiếp từ một thông số kỹ thuật OpenAPI. Điều này đảm bảo rằng mã ứng dụng khách được tạo phản ánh chính xác hợp đồng của API. - GraphQL: Các công cụ như 
graphql-codegencó thể tạo các kiểu TypeScript cho các truy vấn, đột biến và định nghĩa lược đồ hiện có. Điều này cung cấp an toàn kiểu end-to-end từ máy chủ GraphQL của bạn đến mã TypeScript phía máy khách của bạn. 
Ví dụ toàn cầu: Một tập đoàn đa quốc gia sử dụng cổng API trung tâm do thông số kỹ thuật OpenAPI chi phối. Dịch vụ khu vực của mỗi quốc gia hiển thị dữ liệu của mình thông qua cổng này. Các nhà phát triển trên các khu vực khác nhau có thể sử dụng openapi-typescript để tạo các ứng dụng khách an toàn kiểu, đảm bảo tương tác dữ liệu nhất quán bất kể việc triển khai khu vực cơ bản.
Chiến lược triển khai An toàn Kiểu Dữ liệu Data Federation của TypeScript
Triển khai tính an toàn kiểu mạnh mẽ trong kịch bản data federation phân tán đòi hỏi một cách tiếp cận chiến lược, thường liên quan đến nhiều lớp bảo vệ:
1. Quản lý Lược đồ Tập trung
Ý tưởng cốt lõi: Xác định và duy trì một tập hợp các giao diện và kiểu TypeScript tiêu chuẩn đại diện cho các thực thể dữ liệu cốt lõi của bạn trong toàn tổ chức. Những định nghĩa này trở thành nguồn thông tin duy nhất.
Triển khai:
- Monorepo: Lưu trữ các định nghĩa kiểu dùng chung trong một monorepo (ví dụ: bằng cách sử dụng Lerna hoặc không gian làm việc của Yarn) mà tất cả các dịch vụ và ứng dụng khách có thể phụ thuộc vào.
 - Đăng ký gói: Xuất bản các kiểu được chia sẻ này dưới dạng một gói npm, cho phép các nhóm khác nhau cài đặt và sử dụng chúng làm phần phụ thuộc.
 
Lợi ích: Đảm bảo tính nhất quán và giảm trùng lặp. Những thay đổi đối với cấu trúc dữ liệu cốt lõi được quản lý tập trung và tất cả các ứng dụng phụ thuộc được cập nhật đồng thời.
2. Ứng dụng khách API được nhập mạnh mẽ
Ý tưởng cốt lõi: Tạo hoặc viết thủ công các ứng dụng khách API bằng TypeScript tuân thủ nghiêm ngặt các giao diện và kiểu đã xác định của các API mục tiêu.
Triển khai:
- Tạo mã: Tận dụng các công cụ tạo ứng dụng khách từ thông số kỹ thuật API (OpenAPI, GraphQL).
 - Phát triển thủ công: Đối với các API tùy chỉnh hoặc dịch vụ nội bộ, hãy tạo các ứng dụng khách được nhập bằng các thư viện như 
axioshoặcfetchtích hợp sẵn với các chú thích kiểu rõ ràng cho các yêu cầu và phản hồi. 
Ví dụ toàn cầu: Một tổ chức tài chính toàn cầu sử dụng API nội bộ tiêu chuẩn hóa cho dữ liệu khách hàng. Khi một chi nhánh khu vực mới cần tích hợp, họ có thể tự động tạo một ứng dụng khách TypeScript an toàn kiểu cho API cốt lõi này, đảm bảo họ tương tác chính xác với hồ sơ khách hàng trên các quy định và khu vực tài chính khác nhau.
3. Xác thực dữ liệu tại ranh giới
Ý tưởng cốt lõi: Mặc dù TypeScript cung cấp an toàn thời gian biên dịch, dữ liệu vẫn có thể bị sai lệch khi nó vượt qua ranh giới mạng. Triển khai xác thực thời gian chạy ở các cạnh của dịch vụ và lớp liên kết của bạn.
Triển khai:
- Thư viện xác thực lược đồ: Sử dụng các thư viện như 
zod,io-tshoặcajv(cho Lược đồ JSON) trong lớp liên kết hoặc cổng API của bạn để xác thực dữ liệu đến và đi so với các kiểu TypeScript đã xác định của bạn. - Type Guards: Như đã trình bày trong ví dụ trên, hãy triển khai type guards để xác thực dữ liệu có thể được nhận ở định dạng `any` hoặc được gõ lỏng lẻo.
 
Lợi ích: Bắt giữ dữ liệu không mong muốn khi chạy, ngăn dữ liệu bị hỏng lan truyền xa hơn và cung cấp các thông báo lỗi rõ ràng để gỡ lỗi.
4. GraphQL để tổng hợp dữ liệu được liên kết
Ý tưởng cốt lõi: GraphQL vốn phù hợp với data federation. Cách tiếp cận lược đồ trước và gõ mạnh mẽ của nó khiến nó phù hợp một cách tự nhiên để xác định và truy vấn dữ liệu được liên kết.
Triển khai:
- Khâu lược đồ/Liên kết: Các công cụ như Apollo Federation cho phép bạn xây dựng một biểu đồ API GraphQL duy nhất từ nhiều dịch vụ GraphQL cơ bản. Mỗi dịch vụ xác định các kiểu của nó và cổng liên kết kết hợp chúng.
 - Tạo kiểu: Sử dụng 
graphql-codegenđể tạo các kiểu TypeScript chính xác cho lược đồ GraphQL được liên kết của bạn, đảm bảo an toàn kiểu cho tất cả các truy vấn và kết quả của chúng. 
Lợi ích: Các nhà phát triển có thể truy vấn chính xác dữ liệu họ cần, giảm việc tìm nạp quá mức và lược đồ mạnh mẽ cung cấp một hợp đồng rõ ràng cho tất cả người dùng. Việc tích hợp TypeScript với GraphQL đã trưởng thành và mạnh mẽ.
5. Duy trì sự phát triển lược đồ
Ý tưởng cốt lõi: Hệ thống phân tán là động. Lược đồ sẽ thay đổi. Một hệ thống để quản lý những thay đổi này mà không phá vỡ các tích hợp hiện có là rất quan trọng.
Triển khai:
- Kiểm soát phiên bản ngữ nghĩa: Áp dụng kiểm soát phiên bản ngữ nghĩa cho lược đồ API và các gói kiểu được chia sẻ của bạn.
 - Khả năng tương thích ngược: Bất cứ khi nào có thể, hãy thực hiện các thay đổi lược đồ tương thích ngược (ví dụ: thêm các trường tùy chọn thay vì xóa hoặc thay đổi các trường hiện có).
 - Chiến lược ngừng hoạt động: Đánh dấu rõ ràng các trường hoặc toàn bộ API là không được dùng và cung cấp thông báo đầy đủ trước khi xóa.
 - Kiểm tra tự động: Tích hợp các công cụ so sánh lược đồ vào quy trình CI/CD của bạn để phát hiện các thay đổi đột phá trước khi triển khai.
 
Ví dụ toàn cầu: Một nhà cung cấp SaaS toàn cầu phát triển API hồ sơ người dùng cốt lõi của mình. Họ sử dụng các API có phiên bản (ví dụ: `/api/v1/users`, `/api/v2/users`) và ghi lại rõ ràng sự khác biệt. Các kiểu TypeScript được chia sẻ của họ cũng tuân theo việc kiểm soát phiên bản, cho phép các ứng dụng khách di chuyển theo tốc độ của riêng họ.
Lợi ích của An toàn Kiểu Dữ liệu Data Federation của TypeScript
Áp dụng TypeScript cho data federation mang lại vô số lợi thế cho các nhóm phát triển toàn cầu:
- Giảm lỗi thời gian chạy: Việc phát hiện sai lệch kiểu và các vấn đề về cấu trúc dữ liệu trong quá trình phát triển làm giảm đáng kể khả năng xảy ra lỗi thời gian chạy trong sản xuất, đặc biệt quan trọng trong các hệ thống phân tán nơi lỗi có thể có tác động dây chuyền.
 - Cải thiện năng suất của nhà phát triển: Với các định nghĩa kiểu rõ ràng và hỗ trợ IntelliSense trong IDE, các nhà phát triển có thể viết mã nhanh hơn và tự tin hơn. Việc gỡ lỗi trở nên hiệu quả hơn khi trình biên dịch gắn cờ nhiều vấn đề tiềm ẩn trước.
 - Khả năng bảo trì được cải thiện: Mã được nhập tốt dễ hiểu, cấu trúc lại và bảo trì hơn. Khi nhà phát triển cần tương tác với một nguồn dữ liệu được liên kết, các định nghĩa kiểu sẽ ghi lại rõ ràng hình dạng dữ liệu dự kiến.
 - Cải thiện sự hợp tác: Trong các nhóm lớn, phân tán và thường phân tán trên toàn cầu, các kiểu TypeScript được chia sẻ đóng vai trò là một ngôn ngữ và hợp đồng chung, giảm thiểu những hiểu lầm và tạo điều kiện cho sự cộng tác liền mạch giữa các nhóm dịch vụ khác nhau.
 - Quản trị dữ liệu mạnh mẽ hơn: Bằng cách thực thi tính nhất quán kiểu trên các hệ thống phân tán, data federation của TypeScript góp phần vào việc quản trị dữ liệu tốt hơn. Nó đảm bảo rằng dữ liệu tuân thủ các tiêu chuẩn và định nghĩa đã xác định trước, bất kể nguồn gốc hoặc đích đến của nó.
 - Tăng cường sự tự tin trong việc tái cấu trúc: Khi bạn cần tái cấu trúc các dịch vụ hoặc mô hình dữ liệu, phân tích tĩnh của TypeScript cung cấp một biện pháp an toàn, làm nổi bật tất cả các vị trí trong cơ sở mã của bạn có thể bị ảnh hưởng bởi thay đổi.
 - Tạo điều kiện cho tính nhất quán đa nền tảng: Cho dù dữ liệu được liên kết của bạn được sử dụng bởi một ứng dụng web, ứng dụng di động hay dịch vụ phụ trợ, các định nghĩa kiểu nhất quán sẽ đảm bảo sự hiểu biết thống nhất về dữ liệu trên tất cả các nền tảng.
 
Trường hợp nghiên cứu: Nền tảng thương mại điện tử toàn cầu
Hãy xem xét một công ty thương mại điện tử lớn hoạt động ở nhiều quốc gia. Họ có các microservices riêng biệt cho thông tin sản phẩm, hàng tồn kho, giá cả và tài khoản người dùng, mỗi dịch vụ có thể do một nhóm kỹ thuật khu vực quản lý.
- Thách thức: Khi khách hàng xem một trang sản phẩm, giao diện người dùng cần tổng hợp dữ liệu từ các dịch vụ này: chi tiết sản phẩm (từ dịch vụ sản phẩm), giá theo thời gian thực (từ dịch vụ định giá, có tính đến loại tiền tệ và thuế địa phương) và các đề xuất dành riêng cho người dùng (từ dịch vụ đề xuất). Việc đảm bảo tất cả dữ liệu này căn chỉnh chính xác là nguồn gốc liên tục của lỗi.
 - Giải pháp: Công ty đã áp dụng chiến lược data federation bằng GraphQL. Họ đã xác định một lược đồ GraphQL thống nhất đại diện cho chế độ xem dữ liệu sản phẩm của khách hàng. Mỗi microservice hiển thị API GraphQL tuân thủ phần lược đồ được liên kết của nó. Họ đã sử dụng Apollo Federation để xây dựng cổng. Quan trọng, họ đã sử dụng 
graphql-codegenđể tạo các kiểu TypeScript chính xác cho lược đồ được liên kết. - Kết quả: Các nhà phát triển giao diện người dùng hiện đã viết các truy vấn an toàn kiểu đối với API GraphQL được liên kết. Ví dụ: khi tìm nạp dữ liệu sản phẩm, họ nhận được một đối tượng tuân thủ nghiêm ngặt các kiểu TypeScript được tạo, bao gồm mã tiền tệ, định dạng giá và trạng thái còn hàng, tất cả đều được xác thực tại thời gian biên dịch. Điều này làm giảm đáng kể các lỗi liên quan đến tích hợp dữ liệu, tăng tốc độ phát triển tính năng và cải thiện trải nghiệm của khách hàng bằng cách đảm bảo thông tin sản phẩm được bản địa hóa chính xác được hiển thị nhất quán trên toàn thế giới.
 
Kết luận
Trong thời đại của hệ thống phân tán và microservices, việc duy trì tính toàn vẹn và tính nhất quán của dữ liệu là tối quan trọng. TypeScript Data Federation cung cấp một giải pháp mạnh mẽ và chủ động bằng cách kết hợp sức mạnh của ảo hóa dữ liệu với sự an toàn thời gian biên dịch của TypeScript. Bằng cách thiết lập các hợp đồng dữ liệu rõ ràng thông qua các giao diện, tận dụng generics, tích hợp với các ngôn ngữ định nghĩa API và sử dụng các chiến lược như quản lý lược đồ tập trung và xác thực thời gian chạy, các tổ chức có thể xây dựng các ứng dụng đáng tin cậy hơn, có thể bảo trì hơn và cộng tác hơn.
Đối với các nhóm toàn cầu, phương pháp này vượt qua các ranh giới địa lý, cung cấp sự hiểu biết chung về dữ liệu và giảm đáng kể sự xung đột liên quan đến giao tiếp giữa các dịch vụ và giữa các nhóm. Khi kiến trúc ứng dụng của bạn trở nên phức tạp và kết nối hơn, việc áp dụng TypeScript cho data federation không chỉ là một phương pháp hay nhất; đó là một điều cần thiết để đạt được tính an toàn kiểu dữ liệu phân tán thực sự.
Những điểm chính cần ghi nhớ:
- Xác định các hợp đồng của bạn: Sử dụng giao diện và kiểu TypeScript làm nền tảng cho cấu trúc dữ liệu của bạn.
 - Tự động hóa khi có thể: Tận dụng việc tạo mã từ thông số kỹ thuật API (OpenAPI, GraphQL).
 - Xác thực tại các ranh giới: Kết hợp gõ tĩnh với xác thực thời gian chạy.
 - Tập trung các kiểu dùng chung: Sử dụng monorepos hoặc các gói npm cho các định nghĩa chung.
 - Áp dụng GraphQL: Đối với cách tiếp cận lược đồ trước, an toàn kiểu với liên kết.
 - Lên kế hoạch cho sự phát triển: Quản lý các thay đổi lược đồ một cách có chủ ý và với kiểm soát phiên bản rõ ràng.
 
Bằng cách đầu tư vào data federation của TypeScript, bạn đang đầu tư vào sức khỏe và sự thành công lâu dài của các ứng dụng phân tán của mình, trao quyền cho các nhà phát triển trên toàn thế giới xây dựng với sự tự tin.